package http_servlet_request;

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Creared with IntelliJ IDEA.
 * Description:
 * User:yxd
 * Date:2022-05-31
 * Time:14:59
 */
class User{
    public int userId;
    public int classId;
}
@WebServlet("/postJson")
public class PostJsonServlet extends HttpServlet {
    //这里使用Jackson的核心对象:
    ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //而这里就通过Jackson的对象把请求中的内容给读取出来
        //有两个参数,第一个参数表示把哪个字符串进行转换,可以是一个String,也可以是一个inputStream,也可以是一个file,
        //第二个参数表示要把读出来的JSON字符串放到哪个java对象里面
        //具体readValue是如何读取的:1.先把getInputStream输入流的对象里面的数据都读取出来
        //2.然后把这里面的字符串内容进行解析,将字符串转换成一个一个的键值对的结构
        //3.然后再遍历解析出来的键值对,将一个一个的key都获得到,然后用这个key和User的类属性进行对比,看有没有匹配的,(而这里的对比就是通过java的反射机制,将类里面的属性拿出来关键信息)
        // 如果发现匹配的就把这个key锁对应的value值放到这个类属性中(此时也会根据类属性的数据类型进行转换),
        // 如果没有就跳过,直至遍历完所有的key
        //4.然后所有的键值对都遍历完了,此时User对象就构造完成了,然后把结果放回到这个user对象里面去
        User user = objectMapper.readValue(req.getInputStream(),User.class);//(.class)
        //然后这个对象里面的所能匹配的属性就表示了读取出来的JSON内容了
        resp.getWriter().write("userId: " + user.userId + ",classId: " + user.classId);
    }
}
